home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / db3 / db.h < prev   
C/C++ Source or Header  |  2005-10-19  |  51KB  |  1,376 lines

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1996, 1997, 1998, 1999, 2000
  5.  *    Sleepycat Software.  All rights reserved.
  6.  *
  7.  *    $Id: db.src,v 11.121 2001/01/10 15:43:08 sue Exp $
  8.  */
  9.  
  10. #ifndef _DB_H_
  11. #define    _DB_H_
  12.  
  13. #ifndef __NO_SYSTEM_INCLUDES
  14. #include <sys/types.h>
  15.  
  16. #include <stdio.h>
  17. #endif
  18.  
  19. #if defined(__cplusplus)
  20. extern "C" {
  21. #endif
  22.  
  23. /*
  24.  * XXX
  25.  * Handle function prototypes and the keyword "const".  This steps on name
  26.  * space that DB doesn't control, but all of the other solutions are worse.
  27.  *
  28.  * XXX
  29.  * While Microsoft's compiler is ANSI C compliant, it doesn't have _STDC_
  30.  * defined by default, you specify a command line flag or #pragma to turn
  31.  * it on.  Don't do that, however, because some of Microsoft's own header
  32.  * files won't compile.
  33.  */
  34. #undef    __P
  35. #if defined(__STDC__) || defined(__cplusplus) || defined(_MSC_VER)
  36. #define    __P(protos)    protos        /* ANSI C prototypes */
  37. #else
  38. #define    const
  39. #define    __P(protos)    ()        /* K&R C preprocessor */
  40. #endif
  41.  
  42. /*
  43.  * !!!
  44.  * DB needs basic information about specifically sized types.  If they're
  45.  * not provided by the system, typedef them here.
  46.  *
  47.  * We protect them against multiple inclusion using __BIT_TYPES_DEFINED__,
  48.  * as does BIND and Kerberos, since we don't know for sure what #include
  49.  * files the user is using.
  50.  *
  51.  * !!!
  52.  * We also provide the standard u_int, u_long etc., if they're not provided
  53.  * by the system.
  54.  */
  55. #ifndef    __BIT_TYPES_DEFINED__
  56. #define    __BIT_TYPES_DEFINED__
  57.  
  58.  
  59.  
  60.  
  61.  
  62. #endif
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70. #define    DB_VERSION_MAJOR    3
  71. #define    DB_VERSION_MINOR    2
  72. #define    DB_VERSION_PATCH    9
  73. #define    DB_VERSION_STRING    "Sleepycat Software: Berkeley DB 3.2.9: (January 24, 2001)"
  74.  
  75. typedef    u_int32_t    db_pgno_t;    /* Page number type. */
  76. typedef    u_int16_t    db_indx_t;    /* Page offset type. */
  77. #define    DB_MAX_PAGES    0xffffffff    /* >= # of pages in a file */
  78.  
  79. typedef    u_int32_t    db_recno_t;    /* Record number type. */
  80. #define    DB_MAX_RECORDS    0xffffffff    /* >= # of records in a tree */
  81.  
  82. /* Forward structure declarations, so applications get type checking. */
  83. struct __db;        typedef struct __db DB;
  84. #ifdef DB_DBM_HSEARCH
  85.             typedef struct __db DBM;
  86. #endif
  87. struct __db_bt_stat;    typedef struct __db_bt_stat DB_BTREE_STAT;
  88. struct __db_dbt;    typedef struct __db_dbt DBT;
  89. struct __db_env;    typedef struct __db_env DB_ENV;
  90. struct __db_h_stat;    typedef struct __db_h_stat DB_HASH_STAT;
  91. struct __db_ilock;    typedef struct __db_ilock DB_LOCK_ILOCK;
  92. struct __db_lock_stat;    typedef struct __db_lock_stat DB_LOCK_STAT;
  93. struct __db_lock_u;    typedef struct __db_lock_u DB_LOCK;
  94. struct __db_lockreq;    typedef struct __db_lockreq DB_LOCKREQ;
  95. struct __db_log_stat;    typedef struct __db_log_stat DB_LOG_STAT;
  96. struct __db_lsn;    typedef struct __db_lsn DB_LSN;
  97. struct __db_mpool_finfo;typedef struct __db_mpool_finfo DB_MPOOL_FINFO;
  98. struct __db_mpool_fstat;typedef struct __db_mpool_fstat DB_MPOOL_FSTAT;
  99. struct __db_mpool_stat;    typedef struct __db_mpool_stat DB_MPOOL_STAT;
  100. struct __db_mpoolfile;    typedef struct __db_mpoolfile DB_MPOOLFILE;
  101. struct __db_qam_stat;    typedef struct __db_qam_stat DB_QUEUE_STAT;
  102. struct __db_txn;    typedef struct __db_txn DB_TXN;
  103. struct __db_txn_active;    typedef struct __db_txn_active DB_TXN_ACTIVE;
  104. struct __db_txn_stat;    typedef struct __db_txn_stat DB_TXN_STAT;
  105. struct __dbc;        typedef struct __dbc DBC;
  106. struct __dbc_internal;    typedef struct __dbc_internal DBC_INTERNAL;
  107. struct __fh_t;        typedef struct __fh_t DB_FH;
  108. struct __key_range;    typedef struct __key_range DB_KEY_RANGE;
  109.  
  110. /* Key/data structure -- a Data-Base Thang. */
  111. struct __db_dbt {
  112.     /*
  113.      * data/size must be fields 1 and 2 for DB 1.85 compatibility.
  114.      */
  115.     void     *data;            /* Key/data */
  116.     u_int32_t size;            /* key/data length */
  117.  
  118.     u_int32_t ulen;            /* RO: length of user buffer. */
  119.     u_int32_t dlen;            /* RO: get/put record length. */
  120.     u_int32_t doff;            /* RO: get/put record offset. */
  121.  
  122. #define    DB_DBT_ISSET    0x001        /* Lower level calls set value. */
  123. #define    DB_DBT_MALLOC    0x002        /* Return in malloc'd memory. */
  124. #define    DB_DBT_PARTIAL    0x004        /* Partial put/get. */
  125. #define    DB_DBT_REALLOC    0x008        /* Return in realloc'd memory. */
  126. #define    DB_DBT_USERMEM    0x010        /* Return in user's memory. */
  127. #define    DB_DBT_DUPOK    0x020        /* Insert if duplicate. */
  128.     u_int32_t flags;
  129. };
  130.  
  131. /*
  132.  * Common flags --
  133.  *    Interfaces which use any of these common flags should never have
  134.  *    interface specific flags in this range.
  135.  */
  136. #define    DB_CREATE          0x000001    /* Create file as necessary. */
  137. #define    DB_CXX_NO_EXCEPTIONS  0x000002    /* C++: return error values. */
  138. #define    DB_FORCE          0x000004    /* Force (anything). */
  139. #define    DB_NOMMAP          0x000008    /* Don't mmap underlying file. */
  140. #define    DB_RDONLY          0x000010    /* Read-only (O_RDONLY). */
  141. #define    DB_RECOVER          0x000020    /* Run normal recovery. */
  142. #define    DB_THREAD          0x000040    /* Applications are threaded. */
  143. #define    DB_TXN_NOSYNC          0x000080    /* Do not sync log on commit. */
  144. #define    DB_USE_ENVIRON          0x000100    /* Use the environment. */
  145. #define    DB_USE_ENVIRON_ROOT   0x000200    /* Use the environment if root. */
  146.  
  147. /*
  148.  * Flags private to db_env_create.
  149.  */
  150. #define    DB_CLIENT          0x000400    /* Open for a client environment. */
  151.  
  152. /*
  153.  * Flags private to db_create.
  154.  */
  155. #define    DB_XA_CREATE          0x000400    /* Open in an XA environment. */
  156.  
  157. /*
  158.  * Flags private to DBENV->open.
  159.  */
  160. #define    DB_INIT_CDB          0x000400    /* Concurrent Access Methods. */
  161. #define    DB_INIT_LOCK          0x000800    /* Initialize locking. */
  162. #define    DB_INIT_LOG          0x001000    /* Initialize logging. */
  163. #define    DB_INIT_MPOOL          0x002000    /* Initialize mpool. */
  164. #define    DB_INIT_TXN          0x004000    /* Initialize transactions. */
  165. #define    DB_JOINENV          0x008000  /* Initialize all subsystems present. */
  166. #define    DB_LOCKDOWN          0x010000    /* Lock memory into physical core. */
  167. #define    DB_PRIVATE          0x020000    /* DB_ENV is process local. */
  168. #define    DB_RECOVER_FATAL      0x040000    /* Run catastrophic recovery. */
  169. #define    DB_SYSTEM_MEM          0x080000    /* Use system-backed memory. */
  170.  
  171. /*
  172.  * Flags private to DB->open.
  173.  */
  174. #define    DB_EXCL              0x000400    /* Exclusive open (O_EXCL). */
  175. #define    DB_FCNTL_LOCKING      0x000800    /* UNDOC: fcntl(2) locking. */
  176. #define    DB_ODDFILESIZE          0x001000  /* UNDOC: truncate to N * pgsize. */
  177. #define    DB_RDWRMASTER          0x002000  /* UNDOC: allow subdb master open R/W */
  178. #define    DB_TRUNCATE          0x004000    /* Discard existing DB (O_TRUNC). */
  179. #define    DB_EXTENT          0x008000  /* UNDOC: dealing with an extent. */
  180.  
  181. /*
  182.  * Flags private to DBENV->txn_begin.
  183.  */
  184. #define    DB_TXN_NOWAIT          0x000400    /* Do not wait for locks in this TXN. */
  185. #define    DB_TXN_SYNC          0x000800    /* Always sync log on commit. */
  186.  
  187. /*
  188.  * Flags private to DBENV->set_flags.
  189.  */
  190. #define    DB_CDB_ALLDB          0x000400    /* In CDB, lock across environment. */
  191.  
  192. /*
  193.  * Flags private to DB->set_feedback's callback.
  194.  */
  195. #define    DB_UPGRADE          0x000400    /* Upgrading. */
  196. #define    DB_VERIFY          0x000800  /* Verifying. */
  197.  
  198. /*
  199.  * Flags private to DB->set_flags.
  200.  *
  201.  * DB->set_flags does not share common flags and so values start at 0x01.
  202.  */
  203. #define    DB_DUP            0x0001    /* Btree, Hash: duplicate keys. */
  204. #define    DB_DUPSORT        0x0002    /* Btree, Hash: duplicate keys. */
  205. #define    DB_RECNUM        0x0004    /* Btree: record numbers. */
  206. #define    DB_RENUMBER        0x0008    /* Recno: renumber on insert/delete. */
  207. #define    DB_REVSPLITOFF        0x0010    /* Btree: turn off reverse splits. */
  208. #define    DB_SNAPSHOT        0x0020    /* Recno: snapshot the input. */
  209.  
  210. /*
  211.  * Flags private to DB->join.
  212.  *
  213.  * DB->join does not share common flags and so values start at 0x01.
  214.  */
  215. #define    DB_JOIN_NOSORT        0x0001  /* Don't try to optimize join. */
  216.  
  217. /*
  218.  * Flags private to DB->verify.
  219.  *
  220.  * DB->verify does not share common flags and so values start at 0x01.
  221.  */
  222. #define    DB_AGGRESSIVE          0x0001  /* Salvage anything which might be data.*/
  223. #define    DB_NOORDERCHK          0x0002  /* Skip order check; subdb w/ user func */
  224. #define    DB_ORDERCHKONLY          0x0004  /* Only perform an order check on subdb */
  225. #define    DB_PR_PAGE          0x0008  /* Show page contents (-da). */
  226. #define    DB_PR_HEADERS          0x0010  /* Show only page headers (-dh). */
  227. #define    DB_PR_RECOVERYTEST    0x0020  /* Recovery test (-dr). */
  228. #define    DB_SALVAGE          0x0040  /* Salvage what looks like data. */
  229. /*
  230.  * !!!
  231.  * These must not go over 0x8000, or they will collide with the flags
  232.  * used by __bam_vrfy_subtree.
  233.  */
  234. #define    DB_VRFY_FLAGMASK      0xffff  /* For masking above flags. */
  235.  
  236. /*
  237.  * Deadlock detector modes; used in the DBENV structure to configure the
  238.  * locking subsystem.
  239.  */
  240. #define    DB_LOCK_NORUN        0
  241. #define    DB_LOCK_DEFAULT        1    /* Default policy. */
  242. #define    DB_LOCK_OLDEST        2    /* Abort oldest transaction. */
  243. #define    DB_LOCK_RANDOM        3    /* Abort random transaction. */
  244. #define    DB_LOCK_YOUNGEST    4    /* Abort youngest transaction. */
  245.  
  246. /*******************************************************
  247.  * Environment.
  248.  *******************************************************/
  249. #define    DB_REGION_MAGIC    0x120897    /* Environment magic number. */
  250.  
  251. typedef enum {
  252.     DB_TXN_ABORT,
  253.     DB_TXN_BACKWARD_ROLL,
  254.     DB_TXN_FORWARD_ROLL,
  255.     DB_TXN_OPENFILES
  256. } db_recops;
  257.  
  258. #define    DB_UNDO(op)    ((op) == DB_TXN_ABORT || (op) == DB_TXN_BACKWARD_ROLL)
  259. #define    DB_REDO(op)    ((op) == DB_TXN_FORWARD_ROLL)
  260.  
  261. struct __db_env {
  262.     /*******************************************************
  263.      * Public: owned by the application.
  264.      *******************************************************/
  265.     FILE        *db_errfile;    /* Error message file stream. */
  266.     const char    *db_errpfx;    /* Error message prefix. */
  267.                     /* Callbacks. */
  268.     void (*db_errcall) __P((const char *, char *));
  269.     void (*db_feedback) __P((DB_ENV *, int, int));
  270.     void (*db_paniccall) __P((DB_ENV *, int));
  271.     int  (*db_recovery_init) __P((DB_ENV *));
  272.  
  273.     /*
  274.      * Currently, the verbose list is a bit field with room for 32
  275.      * entries.  There's no reason that it needs to be limited, if
  276.      * there are ever more than 32 entries, convert to a bit array.
  277.      */
  278. #define    DB_VERB_CHKPOINT    0x0001    /* List checkpoints. */
  279. #define    DB_VERB_DEADLOCK    0x0002    /* Deadlock detection information. */
  280. #define    DB_VERB_RECOVERY    0x0004    /* Recovery information. */
  281. #define    DB_VERB_WAITSFOR    0x0008    /* Dump waits-for table. */
  282.     u_int32_t     verbose;    /* Verbose output. */
  283.  
  284.     void        *app_private;    /* Application-private handle. */
  285.  
  286.     /* Locking. */
  287.     u_int8_t    *lk_conflicts;    /* Two dimensional conflict matrix. */
  288.     u_int32_t     lk_modes;    /* Number of lock modes in table. */
  289.     u_int32_t     lk_max;    /* Maximum number of locks. */
  290.     u_int32_t     lk_max_lockers;/* Maximum number of lockers. */
  291.     u_int32_t     lk_max_objects;/* Maximum number of locked objects. */
  292.     u_int32_t     lk_detect;    /* Deadlock detect on all conflicts. */
  293.  
  294.     /* Logging. */
  295.     u_int32_t     lg_bsize;    /* Buffer size. */
  296.     u_int32_t     lg_max;    /* Maximum file size. */
  297.  
  298.     /* Memory pool. */
  299.     u_int32_t     mp_gbytes;    /* Cachesize: GB. */
  300.     u_int32_t     mp_bytes;    /* Cachesize: Bytes. */
  301.     size_t         mp_size;    /* DEPRECATED: Cachesize: bytes. */
  302.     int         mp_ncache;    /* Number of cache regions. */
  303.     size_t         mp_mmapsize;    /* Maximum file size for mmap. */
  304.  
  305.     /* Transactions. */
  306.     u_int32_t     tx_max;    /* Maximum number of transactions. */
  307.     time_t         tx_timestamp;    /* Recover to specific timestamp. */
  308.     int (*tx_recover)        /* Dispatch function for recovery. */
  309.         __P((DB_ENV *, DBT *, DB_LSN *, db_recops));
  310.  
  311.     /*******************************************************
  312.      * Private: owned by DB.
  313.      *******************************************************/
  314.     int         db_panic;    /* Panic causing errno. */
  315.  
  316.     /* User files, paths. */
  317.     char        *db_home;    /* Database home. */
  318.     char        *db_log_dir;    /* Database log file directory. */
  319.     char        *db_tmp_dir;    /* Database tmp file directory. */
  320.  
  321.     char           **db_data_dir;    /* Database data file directories. */
  322.     int         data_cnt;    /* Database data file slots. */
  323.     int         data_next;    /* Next Database data file slot. */
  324.  
  325.     int         db_mode;    /* Default open permissions. */
  326.  
  327.     void        *reginfo;    /* REGINFO structure reference. */
  328.     DB_FH        *lockfhp;    /* fcntl(2) locking file handle. */
  329.     long         shm_key;    /* shmget(2) key. */
  330.  
  331.     void        *lg_handle;    /* Log handle. */
  332.  
  333.     void        *lk_handle;    /* Lock handle. */
  334.  
  335.     void        *mp_handle;    /* Mpool handle. */
  336.  
  337.     void        *tx_handle;    /* Txn handle. */
  338.  
  339.     int          (**dtab)        /* Dispatch table */
  340.                 __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  341.     size_t         dtab_size;    /* Slots in the dispatch table. */
  342.  
  343.     void        *cl_handle;    /* RPC: remote client handle. */
  344.     long         cl_id;        /* RPC: Remote client env id. */
  345.  
  346.     int         dblocal_ref;    /* DB_ENV_DBLOCAL: reference count. */
  347.     u_int32_t     db_mutexlocks; /* db_set_mutexlocks */
  348.  
  349.     /*
  350.      * List of open DB handles for this DB_ENV, used for cursor
  351.      * adjustment.  Must be protected for multi-threaded support.
  352.      *
  353.      * !!!
  354.      * As this structure is allocated in per-process memory, the
  355.      * mutex may need to be stored elsewhere on architectures unable
  356.      * to support mutexes in heap memory, e.g. HP/UX 9.
  357.      */
  358.     void        *dblist_mutexp;    /* Mutex. */
  359.     /*
  360.      * !!!
  361.      * Explicit representation of structure in queue.h.
  362.      * LIST_HEAD(dblist, __db);
  363.      */
  364.     struct {
  365.         struct __db *lh_first;
  366.     } dblist;
  367.  
  368.     /*
  369.      * XA support.
  370.      *
  371.      * !!!
  372.      * Explicit representations of structures in queue.h.
  373.      *
  374.      * TAILQ_ENTRY(__db_env);
  375.      */
  376.     struct {
  377.         struct __db_env *tqe_next;
  378.         struct __db_env **tqe_prev;
  379.     } links;
  380.     int         xa_rmid;    /* XA Resource Manager ID. */
  381.     DB_TXN        *xa_txn;    /* XA Current transaction. */
  382.  
  383.     void    *cj_internal;        /* C++/Java private. */
  384.  
  385.                     /* Methods. */
  386.     int  (*close) __P((DB_ENV *, u_int32_t));
  387.     void (*err) __P((const DB_ENV *, int, const char *, ...));
  388.     void (*errx) __P((const DB_ENV *, const char *, ...));
  389.     int  (*open) __P((DB_ENV *, const char *, u_int32_t, int));
  390.     int  (*remove) __P((DB_ENV *, const char *, u_int32_t));
  391.     int  (*set_data_dir) __P((DB_ENV *, const char *));
  392.     void (*set_errcall) __P((DB_ENV *, void (*)(const char *, char *)));
  393.     void (*set_errfile) __P((DB_ENV *, FILE *));
  394.     void (*set_errpfx) __P((DB_ENV *, const char *));
  395.     int  (*set_feedback) __P((DB_ENV *, void (*)(DB_ENV *, int, int)));
  396.     int  (*set_flags) __P((DB_ENV *, u_int32_t, int));
  397.     int  (*set_mutexlocks) __P((DB_ENV *, int));
  398.     int  (*set_paniccall) __P((DB_ENV *, void (*)(DB_ENV *, int)));
  399.     int  (*set_recovery_init) __P((DB_ENV *, int (*)(DB_ENV *)));
  400.     int  (*set_server) __P((DB_ENV *, char *, long, long, u_int32_t));
  401.     int  (*set_shm_key) __P((DB_ENV *, long));
  402.     int  (*set_tmp_dir) __P((DB_ENV *, const char *));
  403.     int  (*set_verbose) __P((DB_ENV *, u_int32_t, int));
  404.  
  405.     int  (*set_lg_bsize) __P((DB_ENV *, u_int32_t));
  406.     int  (*set_lg_dir) __P((DB_ENV *, const char *));
  407.     int  (*set_lg_max) __P((DB_ENV *, u_int32_t));
  408.  
  409.     int  (*set_lk_conflicts) __P((DB_ENV *, u_int8_t *, int));
  410.     int  (*set_lk_detect) __P((DB_ENV *, u_int32_t));
  411.     int  (*set_lk_max) __P((DB_ENV *, u_int32_t));
  412.     int  (*set_lk_max_locks) __P((DB_ENV *, u_int32_t));
  413.     int  (*set_lk_max_lockers) __P((DB_ENV *, u_int32_t));
  414.     int  (*set_lk_max_objects) __P((DB_ENV *, u_int32_t));
  415.  
  416.     int  (*set_mp_mmapsize) __P((DB_ENV *, size_t));
  417.     int  (*set_cachesize) __P((DB_ENV *, u_int32_t, u_int32_t, int));
  418.  
  419.     int  (*set_tx_max) __P((DB_ENV *, u_int32_t));
  420.     int  (*set_tx_recover) __P((DB_ENV *,
  421.         int (*)(DB_ENV *, DBT *, DB_LSN *, db_recops)));
  422.     int  (*set_tx_timestamp) __P((DB_ENV *, time_t *));
  423.  
  424. #ifdef CONFIG_TEST
  425. #define    DB_TEST_PREOPEN         1    /* before __os_open */
  426. #define    DB_TEST_POSTOPEN     2    /* after __os_open */
  427. #define    DB_TEST_POSTLOGMETA     3    /* after logging meta in btree */
  428. #define    DB_TEST_POSTLOG         4    /* after logging all pages */
  429. #define    DB_TEST_POSTSYNC     5    /* after syncing the log */
  430. #define    DB_TEST_PRERENAME     6    /* before __os_rename */
  431. #define    DB_TEST_POSTRENAME     7    /* after __os_rename */
  432.     int         test_abort;    /* Abort value for testing. */
  433.     int         test_copy;    /* Copy value for testing. */
  434. #endif
  435.  
  436. #define    DB_ENV_CDB        0x00001    /* DB_INIT_CDB. */
  437. #define    DB_ENV_CDB_ALLDB    0x00002    /* CDB environment wide locking. */
  438. #define    DB_ENV_CREATE        0x00004    /* DB_CREATE set. */
  439. #define    DB_ENV_DBLOCAL        0x00008    /* DB_ENV allocated for private DB. */
  440. #define    DB_ENV_LOCKDOWN        0x00010    /* DB_LOCKDOWN set. */
  441. #define    DB_ENV_NOMMAP        0x00020    /* DB_NOMMAP set. */
  442. #define    DB_ENV_OPEN_CALLED    0x00040    /* DBENV->open called (paths valid). */
  443. #define    DB_ENV_PRIVATE        0x00080    /* DB_PRIVATE set. */
  444. #define    DB_ENV_RPCCLIENT    0x00100    /* DB_CLIENT set. */
  445. #define    DB_ENV_STANDALONE    0x00200    /* Test: freestanding environment. */
  446. #define    DB_ENV_SYSTEM_MEM    0x00400    /* DB_SYSTEM_MEM set. */
  447. #define    DB_ENV_THREAD        0x00800    /* DB_THREAD set. */
  448. #define    DB_ENV_TXN_NOSYNC    0x01000    /* DB_TXN_NOSYNC set. */
  449. #define    DB_ENV_USER_ALLOC    0x02000    /* User allocated the structure. */
  450.     u_int32_t     flags;        /* Flags. */
  451. };
  452.  
  453. /*******************************************************
  454.  * Access methods.
  455.  *******************************************************/
  456. /*
  457.  * !!!
  458.  * Changes here must be reflected in java/src/com/sleepycat/db/Db.java.
  459.  */
  460. typedef enum {
  461.     DB_BTREE=1,
  462.     DB_HASH,
  463.     DB_RECNO,
  464.     DB_QUEUE,
  465.     DB_UNKNOWN            /* Figure it out on open. */
  466. } DBTYPE;
  467.  
  468. #define    DB_BTREEVERSION    8        /* Current btree version. */
  469. #define    DB_BTREEOLDVER    6        /* Oldest btree version supported. */
  470. #define    DB_BTREEMAGIC    0x053162
  471.  
  472. #define    DB_HASHVERSION    7        /* Current hash version. */
  473. #define    DB_HASHOLDVER    4        /* Oldest hash version supported. */
  474. #define    DB_HASHMAGIC    0x061561
  475.  
  476. #define    DB_QAMVERSION    3        /* Current queue version. */
  477. #define    DB_QAMOLDVER    1        /* Oldest queue version supported. */
  478. #define    DB_QAMMAGIC    0x042253
  479.  
  480. #define    DB_LOGVERSION    3        /* Current log version. */
  481. #define    DB_LOGOLDVER    3        /* Oldest log version supported. */
  482. #define    DB_LOGMAGIC    0x040988
  483.  
  484. /*
  485.  * DB access method and cursor operation values.  Each value is an operation
  486.  * code to which additional bit flags are added.
  487.  */
  488. #define    DB_AFTER     1        /* c_put() */
  489. #define    DB_APPEND     2        /* put() */
  490. #define    DB_BEFORE     3        /* c_put() */
  491. #define    DB_CACHED_COUNTS 4        /* stat() */
  492. #define    DB_CHECKPOINT     5        /* log_put(), log_get() */
  493. #define    DB_CONSUME     6        /* get() */
  494. #define    DB_CONSUME_WAIT  7        /* get() */
  495. #define    DB_CURLSN     8        /* log_put() */
  496. #define    DB_CURRENT     9        /* c_get(), c_put(), log_get() */
  497. #define    DB_FIRST    10        /* c_get(), log_get() */
  498. #define    DB_FLUSH    11        /* log_put() */
  499. #define    DB_GET_BOTH    12        /* get(), c_get() */
  500. #define    DB_GET_BOTHC    13        /* c_get() (internal) */
  501. #define    DB_GET_RECNO    14        /* c_get() */
  502. #define    DB_JOIN_ITEM    15        /* c_get(); do not do primary lookup */
  503. #define    DB_KEYFIRST    16        /* c_put() */
  504. #define    DB_KEYLAST    17        /* c_put() */
  505. #define    DB_LAST        18        /* c_get(), log_get() */
  506. #define    DB_NEXT        19        /* c_get(), log_get() */
  507. #define    DB_NEXT_DUP    20        /* c_get() */
  508. #define    DB_NEXT_NODUP    21        /* c_get() */
  509. #define    DB_NODUPDATA    22        /* put(), c_put() */
  510. #define    DB_NOOVERWRITE    23        /* put() */
  511. #define    DB_NOSYNC    24        /* close() */
  512. #define    DB_POSITION    25        /* c_dup() */
  513. #define    DB_POSITIONI    26        /* c_dup() (internal) */
  514. #define    DB_PREV        27        /* c_get(), log_get() */
  515. #define    DB_PREV_NODUP    28        /* c_get(), log_get() */
  516. #define    DB_RECORDCOUNT    29        /* stat() */
  517. #define    DB_SET        30        /* c_get(), log_get() */
  518. #define    DB_SET_RANGE    31        /* c_get() */
  519. #define    DB_SET_RECNO    32        /* get(), c_get() */
  520. #define    DB_WRITECURSOR    33        /* cursor() */
  521. #define    DB_WRITELOCK    34        /* cursor() (internal) */
  522.  
  523. /* This has to change when the max opcode hits 255. */
  524. #define    DB_OPFLAGS_MASK    0x000000ff    /* Mask for operations flags. */
  525. #define    DB_RMW        0x80000000    /* Acquire write flag immediately. */
  526.  
  527. /*
  528.  * DB (user visible) error return codes.
  529.  *
  530.  * !!!
  531.  * Changes to any of the user visible error return codes must be reflected
  532.  * in java/src/com/sleepycat/db/Db.java.
  533.  *
  534.  * !!!
  535.  * For source compatibility with DB 2.X deadlock return (EAGAIN), use the
  536.  * following:
  537.  *    #include <errno.h>
  538.  *    #define DB_LOCK_DEADLOCK EAGAIN
  539.  *
  540.  * !!!
  541.  * We don't want our error returns to conflict with other packages where
  542.  * possible, so pick a base error value that's hopefully not common.  We
  543.  * document that we own the error name space from -30,800 to -30,999.
  544.  */
  545. /* Public error return codes. */
  546. #define    DB_INCOMPLETE        (-30999)/* Sync didn't finish. */
  547. #define    DB_KEYEMPTY        (-30998)/* Key/data deleted or never created. */
  548. #define    DB_KEYEXIST        (-30997)/* The key/data pair already exists. */
  549. #define    DB_LOCK_DEADLOCK    (-30996)/* Deadlock. */
  550. #define    DB_LOCK_NOTGRANTED    (-30995)/* Lock unavailable. */
  551. #define    DB_NOSERVER        (-30994)/* Server panic return. */
  552. #define    DB_NOSERVER_HOME    (-30993)/* Bad home sent to server. */
  553. #define    DB_NOSERVER_ID        (-30992)/* Bad ID sent to server. */
  554. #define    DB_NOTFOUND        (-30991)/* Key/data pair not found (EOF). */
  555. #define    DB_OLD_VERSION        (-30990)/* Out-of-date version. */
  556. #define    DB_RUNRECOVERY        (-30989)/* Panic return. */
  557. #define    DB_VERIFY_BAD        (-30988)/* Verify failed; bad format. */
  558.  
  559. /* DB (private) error return codes. */
  560. #define    DB_ALREADY_ABORTED    (-30899)
  561. #define    DB_DELETED        (-30898)/* Recovery file marked deleted. */
  562. #define    DB_JAVA_CALLBACK    (-30897)/* Exception during a java callback. */
  563. #define    DB_NEEDSPLIT        (-30896)/* Page needs to be split. */
  564. #define    DB_SWAPBYTES        (-30895)/* Database needs byte swapping. */
  565. #define    DB_TXN_CKP        (-30894)/* Encountered ckp record in log. */
  566. #define    DB_VERIFY_FATAL        (-30893)/* Fatal: DB->verify cannot proceed. */
  567.  
  568. #define    DB_FILE_ID_LEN        20    /* DB file ID length. */
  569.  
  570. /* DB access method description structure. */
  571. struct __db {
  572.     /*******************************************************
  573.      * Public: owned by the application.
  574.      *******************************************************/
  575.     u_int32_t pgsize;        /* Database logical page size. */
  576.  
  577.                     /* Callbacks. */
  578.     int (*db_append_recno) __P((DB *, DBT *, db_recno_t));
  579.     void (*db_feedback) __P((DB *, int, int));
  580.     void *(*db_malloc) __P((size_t));
  581.     void *(*db_realloc) __P((void *, size_t));
  582.     int (*dup_compare) __P((DB *, const DBT *, const DBT *));
  583.  
  584.     void    *app_private;        /* Application-private handle. */
  585.  
  586.     /*******************************************************
  587.      * Private: owned by DB.
  588.      *******************************************************/
  589.     DB_ENV  *dbenv;            /* Backing environment. */
  590.  
  591.     DBTYPE     type;            /* DB access method type. */
  592.  
  593.     DB_MPOOLFILE *mpf;        /* Backing buffer pool. */
  594.  
  595.     void    *mutexp;        /* Synchronization for free threading */
  596.  
  597.     u_int8_t fileid[DB_FILE_ID_LEN];/* File's unique ID for locking. */
  598.  
  599.     u_int32_t adj_fileid;        /* File's unique ID for curs. adj. */
  600.  
  601. #define    DB_LOGFILEID_INVALID    -1
  602.     int32_t     log_fileid;        /* File's unique ID for logging. */
  603.     db_pgno_t meta_pgno;        /* Meta page number */
  604.     DB_TXN    *open_txn;        /* Transaction to protect creates. */
  605.  
  606.     long     cl_id;            /* RPC: remote client id. */
  607.  
  608.     /*
  609.      * !!!
  610.      * Some applications use DB but implement their own locking outside of
  611.      * DB.  If they're using fcntl(2) locking on the underlying database
  612.      * file, and we open and close a file descriptor for that file, we will
  613.      * discard their locks.  The DB_FCNTL_LOCKING flag to DB->open is an
  614.      * undocumented interface to support this usage which leaves any file
  615.      * descriptors we open until DB->close.  This will only work with the
  616.      * DB->open interface and simple caches, e.g., creating a transaction
  617.      * thread may open/close file descriptors this flag doesn't protect.
  618.      * Locking with fcntl(2) on a file that you don't own is a very, very
  619.      * unsafe thing to do.  'Nuff said.
  620.      */
  621.     DB_FH    *saved_open_fhp;    /* Saved file handle. */
  622.  
  623.     /*
  624.      * Linked list of DBP's, used in the log's dbentry table
  625.      * to keep track of all open db handles for a given log id.
  626.      * !!!
  627.      * Explicit representations of structures in queue.h.
  628.      *
  629.      * TAILQ_ENTRY(__db) links;
  630.      */
  631.     struct {
  632.         struct __db *tqe_next;
  633.         struct __db **tqe_prev;
  634.     } links;
  635.  
  636.     /*
  637.      * Linked list of DBP's, linked from the DB_ENV, used to
  638.      * keep track of all open db handles for cursor adjustment.
  639.      *
  640.      * XXX
  641.      * Eventually, this should be merged with "links" above.
  642.      *
  643.      * !!!
  644.      * Explicit representations of structures in queue.h.
  645.      *
  646.      * LIST_ENTRY(__db) dblistlinks;
  647.      */
  648.     struct {
  649.         struct __db *le_next;
  650.         struct __db **le_prev;
  651.     } dblistlinks;
  652.  
  653.     /*
  654.      * Cursor queues.
  655.      *
  656.      * !!!
  657.      * Explicit representations of structures in queue.h.
  658.      *
  659.      * TAILQ_HEAD(free_queue, __dbc);
  660.      * TAILQ_HEAD(active_queue, __dbc);
  661.      * TAILQ_HEAD(join_queue, __dbc);
  662.      */
  663.     struct {
  664.         struct __dbc *tqh_first;
  665.         struct __dbc **tqh_last;
  666.     } free_queue;
  667.     struct {
  668.         struct __dbc *tqh_first;
  669.         struct __dbc **tqh_last;
  670.     } active_queue;
  671.     struct {
  672.         struct __dbc *tqh_first;
  673.         struct __dbc **tqh_last;
  674.     } join_queue;
  675.  
  676.     void    *bt_internal;        /* Btree/Recno access method private. */
  677.     void    *cj_internal;        /* C++/Java private. */
  678.     void    *h_internal;        /* Hash access method private. */
  679.     void    *q_internal;        /* Queue access method private. */
  680.     void    *xa_internal;        /* XA private. */
  681.  
  682.                     /* Methods. */
  683.     int  (*close) __P((DB *, u_int32_t));
  684.     int  (*cursor) __P((DB *, DB_TXN *, DBC **, u_int32_t));
  685.     int  (*del) __P((DB *, DB_TXN *, DBT *, u_int32_t));
  686.     void (*err) __P((DB *, int, const char *, ...));
  687.     void (*errx) __P((DB *, const char *, ...));
  688.     int  (*fd) __P((DB *, int *));
  689.     int  (*get) __P((DB *, DB_TXN *, DBT *, DBT *, u_int32_t));
  690.     int  (*get_byteswapped) __P((DB *));
  691.     DBTYPE
  692.          (*get_type) __P((DB *));
  693.     int  (*join) __P((DB *, DBC **, DBC **, u_int32_t));
  694.     int  (*key_range) __P((DB *,
  695.         DB_TXN *, DBT *, DB_KEY_RANGE *, u_int32_t));
  696.     int  (*open) __P((DB *,
  697.         const char *, const char *, DBTYPE, u_int32_t, int));
  698.     int  (*put) __P((DB *, DB_TXN *, DBT *, DBT *, u_int32_t));
  699.     int  (*remove) __P((DB *, const char *, const char *, u_int32_t));
  700.     int  (*rename) __P((DB *,
  701.         const char *, const char *, const char *, u_int32_t));
  702.     int  (*set_append_recno) __P((DB *, int (*)(DB *, DBT *, db_recno_t)));
  703.     int  (*set_cachesize) __P((DB *, u_int32_t, u_int32_t, int));
  704.     int  (*set_dup_compare) __P((DB *,
  705.         int (*)(DB *, const DBT *, const DBT *)));
  706.     void (*set_errcall) __P((DB *, void (*)(const char *, char *)));
  707.     void (*set_errfile) __P((DB *, FILE *));
  708.     void (*set_errpfx) __P((DB *, const char *));
  709.     int  (*set_feedback) __P((DB *, void (*)(DB *, int, int)));
  710.     int  (*set_flags) __P((DB *, u_int32_t));
  711.     int  (*set_lorder) __P((DB *, int));
  712.     int  (*set_malloc) __P((DB *, void *(*)(size_t)));
  713.     int  (*set_pagesize) __P((DB *, u_int32_t));
  714.     int  (*set_paniccall) __P((DB *, void (*)(DB_ENV *, int)));
  715.     int  (*set_realloc) __P((DB *, void *(*)(void *, size_t)));
  716.     int  (*stat) __P((DB *, void *, void *(*)(size_t), u_int32_t));
  717.     int  (*sync) __P((DB *, u_int32_t));
  718.     int  (*upgrade) __P((DB *, const char *, u_int32_t));
  719.     int  (*verify) __P((DB *,
  720.         const char *, const char *, FILE *, u_int32_t));
  721.  
  722.     int  (*set_bt_compare) __P((DB *,
  723.         int (*)(DB *, const DBT *, const DBT *)));
  724.     int  (*set_bt_maxkey) __P((DB *, u_int32_t));
  725.     int  (*set_bt_minkey) __P((DB *, u_int32_t));
  726.     int  (*set_bt_prefix) __P((DB *,
  727.         size_t (*)(DB *, const DBT *, const DBT *)));
  728.  
  729.     int  (*set_h_ffactor) __P((DB *, u_int32_t));
  730.     int  (*set_h_hash) __P((DB *,
  731.         u_int32_t (*)(DB *, const void *, u_int32_t)));
  732.     int  (*set_h_nelem) __P((DB *, u_int32_t));
  733.  
  734.     int  (*set_re_delim) __P((DB *, int));
  735.     int  (*set_re_len) __P((DB *, u_int32_t));
  736.     int  (*set_re_pad) __P((DB *, int));
  737.     int  (*set_re_source) __P((DB *, const char *));
  738.     int  (*set_q_extentsize) __P((DB *, u_int32_t));
  739.  
  740.     int  (*db_am_remove) __P((DB *, const char *,
  741.         const char *, DB_LSN *, int (**)(DB *, void*), void **));
  742.     int  (*db_am_rename) __P((DB *,
  743.         const char *, const char *, const char *));
  744.  
  745. #define    DB_OK_BTREE    0x01
  746. #define    DB_OK_HASH    0x02
  747. #define    DB_OK_QUEUE    0x04
  748. #define    DB_OK_RECNO    0x08
  749.     u_int32_t    am_ok;        /* Legal AM choices. */
  750.  
  751. #define    DB_AM_DISCARD    0x00001        /* Discard any cached pages. */
  752. #define    DB_AM_DUP    0x00002        /* DB_DUP. */
  753. #define    DB_AM_DUPSORT    0x00004        /* DB_DUPSORT. */
  754. #define    DB_AM_INMEM    0x00008        /* In-memory; no sync on close. */
  755. #define    DB_AM_PGDEF    0x00010        /* Page size was defaulted. */
  756. #define    DB_AM_RDONLY    0x00020        /* Database is readonly. */
  757. #define    DB_AM_RECOVER    0x00040        /* DBP opened by recovery routine. */
  758. #define    DB_AM_SUBDB    0x00080        /* Subdatabases supported. */
  759. #define    DB_AM_SWAP    0x00100        /* Pages need to be byte-swapped. */
  760. #define    DB_AM_TXN    0x00200        /* DBP was in a transaction. */
  761. #define    DB_AM_VERIFYING    0x00400        /* DB handle is in the verifier. */
  762. #define    DB_BT_RECNUM    0x00800        /* DB_RECNUM. */
  763. #define    DB_BT_REVSPLIT    0x01000        /* DB_REVSPLITOFF. */
  764. #define    DB_DBM_ERROR    0x02000        /* Error in DBM/NDBM database. */
  765. #define    DB_OPEN_CALLED    0x04000        /* DB->open called. */
  766. #define    DB_RE_DELIMITER    0x08000        /* Variablen length delimiter set. */
  767. #define    DB_RE_FIXEDLEN    0x10000        /* Fixed-length records. */
  768. #define    DB_RE_PAD    0x20000        /* Fixed-length record pad. */
  769. #define    DB_RE_RENUMBER    0x40000        /* DB_RENUMBER. */
  770. #define    DB_RE_SNAPSHOT    0x80000        /* DB_SNAPSHOT. */
  771.     u_int32_t flags;
  772. };
  773.  
  774. /*
  775.  * DB_LOCK_ILOCK --
  776.  *    Internal DB access method lock.
  777.  */
  778. struct __db_ilock {
  779.     db_pgno_t pgno;            /* Page being locked. */
  780.     u_int8_t fileid[DB_FILE_ID_LEN];/* File id. */
  781. #define    DB_RECORD_LOCK    1
  782. #define    DB_PAGE_LOCK    2
  783.     u_int8_t type;            /* Record or Page lock */
  784. };
  785.  
  786. /*
  787.  * DB_LOCK --
  788.  *    The structure is allocated by the caller and filled in during a
  789.  *    lock_get request (or a lock_vec/DB_LOCK_GET).
  790.  */
  791. struct __db_lock_u {
  792.     size_t        off;        /* Offset of the lock in the region */
  793.     u_int32_t    ndx;        /* Index of the object referenced by
  794.                      * this lock; used for locking. */
  795.     u_int32_t    gen;        /* Generation number of this lock. */
  796. };
  797.  
  798. /* Cursor description structure. */
  799. struct __dbc {
  800.     DB *dbp;            /* Related DB access method. */
  801.     DB_TXN     *txn;            /* Associated transaction. */
  802.  
  803.     /*
  804.      * !!!
  805.      * Explicit representations of structures in queue.h.
  806.      *
  807.      * TAILQ_ENTRY(__dbc) links;    Active/free cursor queues.
  808.      */
  809.     struct {
  810.         DBC *tqe_next;
  811.         DBC **tqe_prev;
  812.     } links;
  813.  
  814.     DBT      rkey;            /* Returned key. */
  815.     DBT      rdata;        /* Returned data. */
  816.  
  817.     u_int32_t lid;            /* Default process' locker id. */
  818.     u_int32_t locker;        /* Locker for this operation. */
  819.     DBT      lock_dbt;        /* DBT referencing lock. */
  820.     DB_LOCK_ILOCK lock;        /* Object to be locked. */
  821.     DB_LOCK      mylock;        /* Lock held on this cursor. */
  822.  
  823.     long      cl_id;        /* Remote client id. */
  824.  
  825.     DBTYPE      dbtype;        /* Cursor type. */
  826.  
  827.     DBC_INTERNAL *internal;        /* Access method private. */
  828.  
  829.     int (*c_close) __P((DBC *));    /* Methods: public. */
  830.     int (*c_count) __P((DBC *, db_recno_t *, u_int32_t));
  831.     int (*c_del) __P((DBC *, u_int32_t));
  832.     int (*c_dup) __P((DBC *, DBC **, u_int32_t));
  833.     int (*c_get) __P((DBC *, DBT *, DBT *, u_int32_t));
  834.     int (*c_put) __P((DBC *, DBT *, DBT *, u_int32_t));
  835.  
  836.                     /* Methods: private. */
  837.     int (*c_am_close) __P((DBC *, db_pgno_t, int *));
  838.     int (*c_am_del) __P((DBC *));
  839.     int (*c_am_destroy) __P((DBC *));
  840.     int (*c_am_get) __P((DBC *, DBT *, DBT *, u_int32_t, db_pgno_t *));
  841.     int (*c_am_put) __P((DBC *, DBT *, DBT *, u_int32_t, db_pgno_t *));
  842.     int (*c_am_writelock) __P((DBC *));
  843.  
  844. #define    DBC_ACTIVE    0x001        /* Cursor is being used. */
  845. #define    DBC_OPD        0x002        /* Cursor references off-page dups. */
  846. #define    DBC_RECOVER    0x004        /* Cursor created by  recovery routine
  847.                      * (do not log or lock).
  848.                      */
  849. #define    DBC_RMW        0x008        /* Acquire write flag in read op. */
  850. #define    DBC_WRITECURSOR    0x010        /* Cursor may be used to write (CDB). */
  851. #define    DBC_WRITEDUP    0x020        /* idup'ed DBC_WRITECURSOR (CDB). */
  852. #define    DBC_WRITER    0x040        /* Cursor immediately writing (CDB). */
  853. #define    DBC_TRANSIENT    0x080        /* Cursor is transient. */
  854. #define    DBC_COMPENSATE    0x100        /* Cursor is doing compensation
  855.                      * do not lock.
  856.                      */
  857.     u_int32_t flags;
  858. };
  859.  
  860. /* Key range statistics structure */
  861. struct __key_range {
  862.     double less;
  863.     double equal;
  864.     double greater;
  865. };
  866.  
  867. /* Btree/Recno statistics structure. */
  868. struct __db_bt_stat {
  869.     u_int32_t bt_magic;        /* Magic number. */
  870.     u_int32_t bt_version;        /* Version number. */
  871.     u_int32_t bt_metaflags;        /* Metadata flags. */
  872.     u_int32_t bt_nkeys;        /* Number of unique keys. */
  873.     u_int32_t bt_ndata;        /* Number of data items. */
  874.     u_int32_t bt_pagesize;        /* Page size. */
  875.     u_int32_t bt_maxkey;        /* Maxkey value. */
  876.     u_int32_t bt_minkey;        /* Minkey value. */
  877.     u_int32_t bt_re_len;        /* Fixed-length record length. */
  878.     u_int32_t bt_re_pad;        /* Fixed-length record pad. */
  879.     u_int32_t bt_levels;        /* Tree levels. */
  880.     u_int32_t bt_int_pg;        /* Internal pages. */
  881.     u_int32_t bt_leaf_pg;        /* Leaf pages. */
  882.     u_int32_t bt_dup_pg;        /* Duplicate pages. */
  883.     u_int32_t bt_over_pg;        /* Overflow pages. */
  884.     u_int32_t bt_free;        /* Pages on the free list. */
  885.     u_int32_t bt_int_pgfree;    /* Bytes free in internal pages. */
  886.     u_int32_t bt_leaf_pgfree;    /* Bytes free in leaf pages. */
  887.     u_int32_t bt_dup_pgfree;    /* Bytes free in duplicate pages. */
  888.     u_int32_t bt_over_pgfree;    /* Bytes free in overflow pages. */
  889. };
  890.  
  891. /* Queue statistics structure. */
  892. struct __db_qam_stat {
  893.     u_int32_t qs_magic;        /* Magic number. */
  894.     u_int32_t qs_version;        /* Version number. */
  895.     u_int32_t qs_metaflags;        /* Metadata flags. */
  896.     u_int32_t qs_nkeys;        /* Number of unique keys. */
  897.     u_int32_t qs_ndata;        /* Number of data items. */
  898.     u_int32_t qs_pagesize;        /* Page size. */
  899.     u_int32_t qs_pages;        /* Data pages. */
  900.     u_int32_t qs_re_len;        /* Fixed-length record length. */
  901.     u_int32_t qs_re_pad;        /* Fixed-length record pad. */
  902.     u_int32_t qs_pgfree;        /* Bytes free in data pages. */
  903.     u_int32_t qs_first_recno;    /* First not deleted record. */
  904.     u_int32_t qs_cur_recno;        /* Last allocated record number. */
  905. };
  906.  
  907. /* Hash statistics structure. */
  908. struct __db_h_stat {
  909.     u_int32_t hash_magic;        /* Magic number. */
  910.     u_int32_t hash_version;        /* Version number. */
  911.     u_int32_t hash_metaflags;    /* Metadata flags. */
  912.     u_int32_t hash_nkeys;        /* Number of unique keys. */
  913.     u_int32_t hash_ndata;        /* Number of data items. */
  914.     u_int32_t hash_pagesize;    /* Page size. */
  915.     u_int32_t hash_nelem;        /* Original nelem specified. */
  916.     u_int32_t hash_ffactor;        /* Fill factor specified at create. */
  917.     u_int32_t hash_buckets;        /* Number of hash buckets. */
  918.     u_int32_t hash_free;        /* Pages on the free list. */
  919.     u_int32_t hash_bfree;        /* Bytes free on bucket pages. */
  920.     u_int32_t hash_bigpages;    /* Number of big key/data pages. */
  921.     u_int32_t hash_big_bfree;    /* Bytes free on big item pages. */
  922.     u_int32_t hash_overflows;    /* Number of overflow pages. */
  923.     u_int32_t hash_ovfl_free;    /* Bytes free on ovfl pages. */
  924.     u_int32_t hash_dup;        /* Number of dup pages. */
  925.     u_int32_t hash_dup_free;    /* Bytes free on duplicate pages. */
  926. };
  927.  
  928. int   db_create __P((DB **, DB_ENV *, u_int32_t));
  929. int   db_env_create __P((DB_ENV **, u_int32_t));
  930. int   db_env_set_func_close __P((int (*)(int)));
  931. int   db_env_set_func_dirfree __P((void (*)(char **, int)));
  932. int   db_env_set_func_dirlist __P((int (*)(const char *, char ***, int *)));
  933. int   db_env_set_func_exists __P((int (*)(const char *, int *)));
  934. int   db_env_set_func_free __P((void (*)(void *)));
  935. int   db_env_set_func_fsync __P((int (*)(int)));
  936. int   db_env_set_func_ioinfo __P((int (*)(const char *,
  937.       int, u_int32_t *, u_int32_t *, u_int32_t *)));
  938. int   db_env_set_func_malloc __P((void *(*)(size_t)));
  939. int   db_env_set_func_map __P((int (*)(char *, size_t, int, int, void **)));
  940. int   db_env_set_func_open __P((int (*)(const char *, int, ...)));
  941. int   db_env_set_func_read __P((ssize_t (*)(int, void *, size_t)));
  942. int   db_env_set_func_realloc __P((void *(*)(void *, size_t)));
  943. int   db_env_set_func_rename __P((int (*)(const char *, const char *)));
  944. int   db_env_set_func_seek
  945.       __P((int (*)(int, size_t, db_pgno_t, u_int32_t, int, int)));
  946. int   db_env_set_func_sleep __P((int (*)(u_long, u_long)));
  947. int   db_env_set_func_unlink __P((int (*)(const char *)));
  948. int   db_env_set_func_unmap __P((int (*)(void *, size_t)));
  949. int   db_env_set_func_write __P((ssize_t (*)(int, const void *, size_t)));
  950. int   db_env_set_func_yield __P((int (*)(void)));
  951. int   db_env_set_pageyield __P((int));
  952. int   db_env_set_panicstate __P((int));
  953. int   db_env_set_region_init __P((int));
  954. int   db_env_set_tas_spins __P((u_int32_t));
  955. char *db_strerror __P((int));
  956. char *db_version __P((int *, int *, int *));
  957.  
  958. /*******************************************************
  959.  * Locking
  960.  *******************************************************/
  961. #define    DB_LOCKVERSION    1
  962.  
  963. /* Flag values for lock_vec(), lock_get(). */
  964. #define    DB_LOCK_NOWAIT        0x01    /* Don't wait on unavailable lock. */
  965. #define    DB_LOCK_RECORD        0x02    /* Internal: record lock. */
  966. #define    DB_LOCK_UPGRADE        0x04    /* Internal: upgrade existing lock. */
  967. #define    DB_LOCK_SWITCH        0x08    /* Internal: switch existing lock. */
  968.  
  969. /* Flag values for lock_detect(). */
  970. #define    DB_LOCK_CONFLICT    0x01    /* Run on any conflict. */
  971.  
  972. /*
  973.  * Request types.
  974.  *
  975.  * !!!
  976.  * Changes here must be reflected in java/src/com/sleepycat/db/Db.java.
  977.  */
  978. typedef enum {
  979.     DB_LOCK_DUMP=0,            /* Display held locks. */
  980.     DB_LOCK_GET,            /* Get the lock. */
  981.     DB_LOCK_INHERIT,        /* Pass locks to parent. */
  982.     DB_LOCK_PUT,            /* Release the lock. */
  983.     DB_LOCK_PUT_ALL,        /* Release locker's locks. */
  984.     DB_LOCK_PUT_OBJ            /* Release locker's locks on obj. */
  985. } db_lockop_t;
  986.  
  987. /*
  988.  * Simple R/W lock modes and for multi-granularity intention locking.
  989.  *
  990.  * !!!
  991.  * These values are NOT random, as they are used as an index into the lock
  992.  * conflicts arrays, i.e., DB_LOCK_IWRITE must be == 3, and DB_LOCK_IREAD
  993.  * must be == 4.
  994.  *
  995.  * !!!
  996.  * Changes here must be reflected in java/src/com/sleepycat/db/Db.java.
  997.  */
  998. typedef enum {
  999.     DB_LOCK_NG=0,            /* Not granted. */
  1000.     DB_LOCK_READ,            /* Shared/read. */
  1001.     DB_LOCK_WRITE,            /* Exclusive/write. */
  1002.     DB_LOCK_WAIT,            /* Wait for event */
  1003.     DB_LOCK_IWRITE,            /* Intent exclusive/write. */
  1004.     DB_LOCK_IREAD,            /* Intent to share/read. */
  1005.     DB_LOCK_IWR            /* Intent to read and write. */
  1006. } db_lockmode_t;
  1007.  
  1008. /*
  1009.  * Status of a lock.
  1010.  */
  1011. typedef enum {
  1012.     DB_LSTAT_ABORTED,        /* Lock belongs to an aborted txn. */
  1013.     DB_LSTAT_ERR,            /* Lock is bad. */
  1014.     DB_LSTAT_FREE,            /* Lock is unallocated. */
  1015.     DB_LSTAT_HELD,            /* Lock is currently held. */
  1016.     DB_LSTAT_NOGRANT,        /* Lock was not granted. */
  1017.     DB_LSTAT_PENDING,        /* Lock was waiting and has been
  1018.                      * promoted; waiting for the owner
  1019.                      * to run and upgrade it to held. */
  1020.     DB_LSTAT_WAITING        /* Lock is on the wait queue. */
  1021. } db_status_t;
  1022.  
  1023. /* Lock request structure. */
  1024. struct __db_lockreq {
  1025.     db_lockop_t     op;        /* Operation. */
  1026.     db_lockmode_t     mode;        /* Requested mode. */
  1027.     u_int32_t     locker;    /* Locker identity. */
  1028.     DBT        *obj;        /* Object being locked. */
  1029.     DB_LOCK         lock;        /* Lock returned. */
  1030. };
  1031.  
  1032. /*
  1033.  * Commonly used conflict matrices.
  1034.  *
  1035.  */
  1036.  
  1037. /* Multi-granularity locking. */
  1038. #define    DB_LOCK_RIW_N    7
  1039. extern const u_int8_t db_riw_conflicts[];
  1040.  
  1041. struct __db_lock_stat {
  1042.     u_int32_t st_lastid;        /* Last allocated locker ID. */
  1043.     u_int32_t st_maxlocks;        /* Maximum number of locks in table. */
  1044.     u_int32_t st_maxlockers;    /* Maximum number of lockers in table. */
  1045.     u_int32_t st_maxobjects;    /* Maximum number of objects in table. */
  1046.     u_int32_t st_nmodes;        /* Number of lock modes. */
  1047.     u_int32_t st_nlocks;        /* Current number of locks. */
  1048.     u_int32_t st_maxnlocks;        /* Maximum number of locks so far. */
  1049.     u_int32_t st_nlockers;        /* Current number of lockers. */
  1050.     u_int32_t st_maxnlockers;    /* Maximum number of lockers so far. */
  1051.     u_int32_t st_nobjects;        /* Current number of objects. */
  1052.     u_int32_t st_maxnobjects;    /* Maximum number of objects so far. */
  1053.     u_int32_t st_nconflicts;    /* Number of lock conflicts. */
  1054.     u_int32_t st_nrequests;        /* Number of lock gets. */
  1055.     u_int32_t st_nreleases;        /* Number of lock puts. */
  1056.     u_int32_t st_nnowaits;        /* Number of requests that would have
  1057.                        waited, but NOWAIT was set. */
  1058.     u_int32_t st_ndeadlocks;    /* Number of lock deadlocks. */
  1059.     u_int32_t st_region_wait;    /* Region lock granted after wait. */
  1060.     u_int32_t st_region_nowait;    /* Region lock granted without wait. */
  1061.     u_int32_t st_regsize;        /* Region size. */
  1062. };
  1063.  
  1064. int      lock_detect __P((DB_ENV *, u_int32_t, u_int32_t, int *));
  1065. int      lock_get __P((DB_ENV *,
  1066.         u_int32_t, u_int32_t, const DBT *, db_lockmode_t, DB_LOCK *));
  1067. int      lock_id __P((DB_ENV *, u_int32_t *));
  1068. int      lock_put __P((DB_ENV *, DB_LOCK *));
  1069. int      lock_stat __P((DB_ENV *, DB_LOCK_STAT **, void *(*)(size_t)));
  1070. int      lock_vec __P((DB_ENV *,
  1071.         u_int32_t, u_int32_t, DB_LOCKREQ *, int, DB_LOCKREQ **));
  1072.  
  1073. /*******************************************************
  1074.  * Logging.
  1075.  *******************************************************/
  1076. /* Flag values for log_archive(). */
  1077. #define    DB_ARCH_ABS        0x001    /* Absolute pathnames. */
  1078. #define    DB_ARCH_DATA        0x002    /* Data files. */
  1079. #define    DB_ARCH_LOG        0x004    /* Log files. */
  1080.  
  1081. /*
  1082.  * A DB_LSN has two parts, a fileid which identifies a specific file, and an
  1083.  * offset within that file.  The fileid is an unsigned 4-byte quantity that
  1084.  * uniquely identifies a file within the log directory -- currently a simple
  1085.  * counter inside the log.  The offset is also an unsigned 4-byte value.  The
  1086.  * log manager guarantees the offset is never more than 4 bytes by switching
  1087.  * to a new log file before the maximum length imposed by an unsigned 4-byte
  1088.  * offset is reached.
  1089.  */
  1090. struct __db_lsn {
  1091.     u_int32_t    file;        /* File ID. */
  1092.     u_int32_t    offset;        /* File offset. */
  1093. };
  1094.  
  1095. /* Log statistics structure. */
  1096. struct __db_log_stat {
  1097.     u_int32_t st_magic;        /* Log file magic number. */
  1098.     u_int32_t st_version;        /* Log file version number. */
  1099.     int st_mode;            /* Log file mode. */
  1100.     u_int32_t st_lg_bsize;        /* Log buffer size. */
  1101.     u_int32_t st_lg_max;        /* Maximum log file size. */
  1102.     u_int32_t st_w_bytes;        /* Bytes to log. */
  1103.     u_int32_t st_w_mbytes;        /* Megabytes to log. */
  1104.     u_int32_t st_wc_bytes;        /* Bytes to log since checkpoint. */
  1105.     u_int32_t st_wc_mbytes;        /* Megabytes to log since checkpoint. */
  1106.     u_int32_t st_wcount;        /* Total writes to the log. */
  1107.     u_int32_t st_wcount_fill;    /* Overflow writes to the log. */
  1108.     u_int32_t st_scount;        /* Total syncs to the log. */
  1109.     u_int32_t st_region_wait;    /* Region lock granted after wait. */
  1110.     u_int32_t st_region_nowait;    /* Region lock granted without wait. */
  1111.     u_int32_t st_cur_file;        /* Current log file number. */
  1112.     u_int32_t st_cur_offset;    /* Current log file offset. */
  1113.     u_int32_t st_regsize;        /* Region size. */
  1114. };
  1115.  
  1116. int     log_archive __P((DB_ENV *, char **[], u_int32_t, void *(*)(size_t)));
  1117. int     log_compare __P((const DB_LSN *, const DB_LSN *));
  1118. int     log_file __P((DB_ENV *, const DB_LSN *, char *, size_t));
  1119. int     log_flush __P((DB_ENV *, const DB_LSN *));
  1120. int     log_get __P((DB_ENV *, DB_LSN *, DBT *, u_int32_t));
  1121. int     log_put __P((DB_ENV *, DB_LSN *, const DBT *, u_int32_t));
  1122. int     log_register __P((DB_ENV *, DB *, const char *));
  1123. int     log_stat __P((DB_ENV *, DB_LOG_STAT **, void *(*)(size_t)));
  1124. int     log_unregister __P((DB_ENV *, DB *));
  1125.  
  1126. /*******************************************************
  1127.  * Mpool
  1128.  *******************************************************/
  1129. /* Flag values for memp_fget(). */
  1130. #define    DB_MPOOL_CREATE        0x001    /* Create a page. */
  1131. #define    DB_MPOOL_LAST        0x002    /* Return the last page. */
  1132. #define    DB_MPOOL_NEW        0x004    /* Create a new page. */
  1133. #define    DB_MPOOL_NEW_GROUP    0x008    /* Create a group of pages. */
  1134. #define    DB_MPOOL_EXTENT        0x010    /* Get for an extent. */
  1135.  
  1136. /* Flag values for memp_fput(), memp_fset(). */
  1137. #define    DB_MPOOL_CLEAN        0x001    /* Page is not modified. */
  1138. #define    DB_MPOOL_DIRTY        0x002    /* Page is modified. */
  1139. #define    DB_MPOOL_DISCARD    0x004    /* Don't cache the page. */
  1140.  
  1141. /* Mpool statistics structure. */
  1142. struct __db_mpool_stat {
  1143.     u_int32_t st_cache_hit;        /* Pages found in the cache. */
  1144.     u_int32_t st_cache_miss;    /* Pages not found in the cache. */
  1145.     u_int32_t st_map;        /* Pages from mapped files. */
  1146.     u_int32_t st_page_create;    /* Pages created in the cache. */
  1147.     u_int32_t st_page_in;        /* Pages read in. */
  1148.     u_int32_t st_page_out;        /* Pages written out. */
  1149.     u_int32_t st_ro_evict;        /* Clean pages forced from the cache. */
  1150.     u_int32_t st_rw_evict;        /* Dirty pages forced from the cache. */
  1151.     u_int32_t st_hash_buckets;    /* Number of hash buckets. */
  1152.     u_int32_t st_hash_searches;    /* Total hash chain searches. */
  1153.     u_int32_t st_hash_longest;    /* Longest hash chain searched. */
  1154.     u_int32_t st_hash_examined;    /* Total hash entries searched. */
  1155.     u_int32_t st_page_clean;    /* Clean pages. */
  1156.     u_int32_t st_page_dirty;    /* Dirty pages. */
  1157.     u_int32_t st_page_trickle;    /* Pages written by memp_trickle. */
  1158.     u_int32_t st_region_wait;    /* Region lock granted after wait. */
  1159.     u_int32_t st_region_nowait;    /* Region lock granted without wait. */
  1160.     u_int32_t st_gbytes;        /* Total cache size: GB. */
  1161.     u_int32_t st_bytes;        /* Total cache size: B. */
  1162.     u_int32_t st_ncache;        /* Number of caches. */
  1163.     u_int32_t st_regsize;        /* Cache size. */
  1164. };
  1165.  
  1166. /* Mpool file open information structure. */
  1167. struct __db_mpool_finfo {
  1168.     int       ftype;        /* File type. */
  1169.     DBT      *pgcookie;        /* Byte-string passed to pgin/pgout. */
  1170.     u_int8_t  *fileid;        /* Unique file ID. */
  1171.     int32_t       lsn_offset;        /* LSN offset in page. */
  1172.     u_int32_t  clear_len;        /* Cleared length on created pages. */
  1173. };
  1174.  
  1175. /* Mpool file statistics structure. */
  1176. struct __db_mpool_fstat {
  1177.     char *file_name;        /* File name. */
  1178.     size_t st_pagesize;        /* Page size. */
  1179.     u_int32_t st_cache_hit;        /* Pages found in the cache. */
  1180.     u_int32_t st_cache_miss;    /* Pages not found in the cache. */
  1181.     u_int32_t st_map;        /* Pages from mapped files. */
  1182.     u_int32_t st_page_create;    /* Pages created in the cache. */
  1183.     u_int32_t st_page_in;        /* Pages read in. */
  1184.     u_int32_t st_page_out;        /* Pages written out. */
  1185. };
  1186.  
  1187. int    memp_fclose __P((DB_MPOOLFILE *));
  1188. int    memp_fget __P((DB_MPOOLFILE *, db_pgno_t *, u_int32_t, void *));
  1189. int    memp_fopen __P((DB_ENV *, const char *,
  1190.         u_int32_t, int, size_t, DB_MPOOL_FINFO *, DB_MPOOLFILE **));
  1191. int    memp_fput __P((DB_MPOOLFILE *, void *, u_int32_t));
  1192. int    memp_fset __P((DB_MPOOLFILE *, void *, u_int32_t));
  1193. int    memp_fsync __P((DB_MPOOLFILE *));
  1194. int    memp_register __P((DB_ENV *, int,
  1195.         int (*)(DB_ENV *, db_pgno_t, void *, DBT *),
  1196.         int (*)(DB_ENV *, db_pgno_t, void *, DBT *)));
  1197. int    memp_stat __P((DB_ENV *,
  1198.         DB_MPOOL_STAT **, DB_MPOOL_FSTAT ***, void *(*)(size_t)));
  1199. int    memp_sync __P((DB_ENV *, DB_LSN *));
  1200. int    memp_trickle __P((DB_ENV *, int, int *));
  1201.  
  1202. /*******************************************************
  1203.  * Transactions.
  1204.  *******************************************************/
  1205. #define    DB_TXNVERSION    1
  1206.  
  1207. /* Operations values to the tx_recover() function. */
  1208. #define    DB_TXN_BACKWARD_ROLL    1    /* Read the log backwards. */
  1209. #define    DB_TXN_FORWARD_ROLL    2    /* Read the log forwards. */
  1210. #define    DB_TXN_OPENFILES    3    /* Read for open files. */
  1211. #define    DB_TXN_REDO        4    /* Redo the operation. */
  1212. #define    DB_TXN_UNDO        5    /* Undo the operation. */
  1213.  
  1214. /* Internal transaction status values. */
  1215.  
  1216. /* Transaction statistics structure. */
  1217. struct __db_txn_active {
  1218.     u_int32_t    txnid;        /* Transaction ID */
  1219.     u_int32_t    parentid;    /* Transaction ID of parent */
  1220.     DB_LSN        lsn;        /* Lsn of the begin record */
  1221. };
  1222.  
  1223. struct __db_txn_stat {
  1224.     DB_LSN      st_last_ckp;        /* lsn of the last checkpoint */
  1225.     DB_LSN      st_pending_ckp;    /* last checkpoint did not finish */
  1226.     time_t      st_time_ckp;        /* time of last checkpoint */
  1227.     u_int32_t st_last_txnid;    /* last transaction id given out */
  1228.     u_int32_t st_maxtxns;        /* maximum txns possible */
  1229.     u_int32_t st_naborts;        /* number of aborted transactions */
  1230.     u_int32_t st_nbegins;        /* number of begun transactions */
  1231.     u_int32_t st_ncommits;        /* number of committed transactions */
  1232.     u_int32_t st_nactive;        /* number of active transactions */
  1233.     u_int32_t st_maxnactive;    /* maximum active transactions */
  1234.     DB_TXN_ACTIVE
  1235.          *st_txnarray;        /* array of active transactions */
  1236.     u_int32_t st_region_wait;    /* Region lock granted after wait. */
  1237.     u_int32_t st_region_nowait;    /* Region lock granted without wait. */
  1238.     u_int32_t st_regsize;        /* Region size. */
  1239. };
  1240.  
  1241. int      txn_abort __P((DB_TXN *));
  1242. int      txn_begin __P((DB_ENV *, DB_TXN *, DB_TXN **, u_int32_t));
  1243. int      txn_checkpoint __P((DB_ENV *, u_int32_t, u_int32_t, u_int32_t));
  1244. int      txn_commit __P((DB_TXN *, u_int32_t));
  1245. u_int32_t txn_id __P((DB_TXN *));
  1246. int      txn_prepare __P((DB_TXN *));
  1247. int      txn_stat __P((DB_ENV *, DB_TXN_STAT **, void *(*)(size_t)));
  1248.  
  1249. #ifndef DB_DBM_HSEARCH
  1250. #define    DB_DBM_HSEARCH    0        /* No historic interfaces by default. */
  1251. #endif
  1252. #if DB_DBM_HSEARCH != 0
  1253. /*******************************************************
  1254.  * Dbm/Ndbm historic interfaces.
  1255.  *******************************************************/
  1256. #define    DBM_INSERT    0        /* Flags to dbm_store(). */
  1257. #define    DBM_REPLACE    1
  1258.  
  1259. /*
  1260.  * The DB support for ndbm(3) always appends this suffix to the
  1261.  * file name to avoid overwriting the user's original database.
  1262.  */
  1263. #define    DBM_SUFFIX    ".db"
  1264.  
  1265. #if defined(_XPG4_2)
  1266. typedef struct {
  1267.     char *dptr;
  1268.     size_t dsize;
  1269. } datum;
  1270. #else
  1271. typedef struct {
  1272.     char *dptr;
  1273.     int dsize;
  1274. } datum;
  1275. #endif
  1276.  
  1277. /*
  1278.  * Translate DBM calls into DB calls so that DB doesn't step on the
  1279.  * application's name space.
  1280.  *
  1281.  * The global variables dbrdonly, dirf and pagf were not retained when 4BSD
  1282.  * replaced the dbm interface with ndbm, and are not supported here.
  1283.  */
  1284. #define    dbminit(a)    __db_dbm_init(a)
  1285. #define    dbmclose    __db_dbm_close
  1286. #if !defined(__cplusplus)
  1287. #define    delete(a)    __db_dbm_delete(a)
  1288. #endif
  1289. #define    fetch(a)    __db_dbm_fetch(a)
  1290. #define    firstkey    __db_dbm_firstkey
  1291. #define    nextkey(a)    __db_dbm_nextkey(a)
  1292. #define    store(a, b)    __db_dbm_store(a, b)
  1293.  
  1294. /* Prototype the DB calls. */
  1295. int     __db_dbm_close __P((void));
  1296. int     __db_dbm_dbrdonly __P((void));
  1297. int     __db_dbm_delete __P((datum));
  1298. int     __db_dbm_dirf __P((void));
  1299. datum     __db_dbm_fetch __P((datum));
  1300. datum     __db_dbm_firstkey __P((void));
  1301. int     __db_dbm_init __P((char *));
  1302. datum     __db_dbm_nextkey __P((datum));
  1303. int     __db_dbm_pagf __P((void));
  1304. int     __db_dbm_store __P((datum, datum));
  1305.  
  1306. /*
  1307.  * Translate NDBM calls into DB calls so that DB doesn't step on the
  1308.  * application's name space.
  1309.  */
  1310. #define    dbm_clearerr(a)        __db_ndbm_clearerr(a)
  1311. #define    dbm_close(a)        __db_ndbm_close(a)
  1312. #define    dbm_delete(a, b)    __db_ndbm_delete(a, b)
  1313. #define    dbm_dirfno(a)        __db_ndbm_dirfno(a)
  1314. #define    dbm_error(a)        __db_ndbm_error(a)
  1315. #define    dbm_fetch(a, b)        __db_ndbm_fetch(a, b)
  1316. #define    dbm_firstkey(a)        __db_ndbm_firstkey(a)
  1317. #define    dbm_nextkey(a)        __db_ndbm_nextkey(a)
  1318. #define    dbm_open(a, b, c)    __db_ndbm_open(a, b, c)
  1319. #define    dbm_pagfno(a)        __db_ndbm_pagfno(a)
  1320. #define    dbm_rdonly(a)        __db_ndbm_rdonly(a)
  1321. #define    dbm_store(a, b, c, d)    __db_ndbm_store(a, b, c, d)
  1322.  
  1323. /* Prototype the DB calls. */
  1324. int     __db_ndbm_clearerr __P((DBM *));
  1325. void     __db_ndbm_close __P((DBM *));
  1326. int     __db_ndbm_delete __P((DBM *, datum));
  1327. int     __db_ndbm_dirfno __P((DBM *));
  1328. int     __db_ndbm_error __P((DBM *));
  1329. datum     __db_ndbm_fetch __P((DBM *, datum));
  1330. datum     __db_ndbm_firstkey __P((DBM *));
  1331. datum     __db_ndbm_nextkey __P((DBM *));
  1332. DBM    *__db_ndbm_open __P((const char *, int, int));
  1333. int     __db_ndbm_pagfno __P((DBM *));
  1334. int     __db_ndbm_rdonly __P((DBM *));
  1335. int     __db_ndbm_store __P((DBM *, datum, datum, int));
  1336.  
  1337. /*******************************************************
  1338.  * Hsearch historic interface.
  1339.  *******************************************************/
  1340. typedef enum {
  1341.     FIND, ENTER
  1342. } ACTION;
  1343.  
  1344. typedef struct entry {
  1345.     char *key;
  1346.     char *data;
  1347. } ENTRY;
  1348.  
  1349. /*
  1350.  * Translate HSEARCH calls into DB calls so that DB doesn't step on the
  1351.  * application's name space.
  1352.  */
  1353. #define    hcreate(a)    __db_hcreate(a)
  1354. #define    hdestroy    __db_hdestroy
  1355. #define    hsearch(a, b)    __db_hsearch(a, b)
  1356.  
  1357. /* Prototype the DB calls. */
  1358. int     __db_hcreate __P((size_t));
  1359. void     __db_hdestroy __P((void));
  1360. ENTRY    *__db_hsearch __P((ENTRY, ACTION));
  1361. #endif /* DB_DBM_HSEARCH */
  1362.  
  1363. /*
  1364.  * XXX
  1365.  * MacOS: Reset Metrowerks C enum sizes.
  1366.  */
  1367. #ifdef __MWERKS__
  1368. #pragma enumsalwaysint reset
  1369. #endif
  1370.  
  1371. #if defined(__cplusplus)
  1372. }
  1373. #endif
  1374.  
  1375. #endif /* !_DB_H_ */
  1376.